Another fix for cross-compiled build scripts
authorAlex Crichton <alex@alexcrichton.com>
Fri, 7 Nov 2014 20:59:44 +0000 (12:59 -0800)
committerAlex Crichton <alex@alexcrichton.com>
Fri, 7 Nov 2014 20:59:44 +0000 (12:59 -0800)
Previously the host/target requirement for packages was not correctly calculated
as dependency edges to build dependencies weren't traversed by accident.

src/cargo/ops/cargo_rustc/context.rs
tests/test_cargo_cross_compile.rs

index 89e526308ef5087aae7b00923cea4946949e6b7d..600d65449e14d4fcc53a244da0b36618867212ba 100644 (file)
@@ -149,10 +149,10 @@ impl<'a, 'b: 'a> Context<'a, 'b> {
 
     fn build_requirements(&mut self, pkg: &'a Package, target: &'a Target,
                           req: PlatformRequirement,
-                          visiting: &mut HashSet<&'a PackageId>) {
-        if !visiting.insert(pkg.get_package_id()) { return }
+                          visiting: &mut HashSet<(&'a PackageId, &'a str)>) {
 
         let key = (pkg.get_package_id(), target.get_name());
+        if !visiting.insert(key) { return }
         let req = if target.get_profile().is_for_host() {PlatformPlugin} else {req};
         match self.requirements.entry(key) {
             Occupied(mut entry) => { *entry.get_mut() = entry.get().combine(req); }
@@ -163,7 +163,15 @@ impl<'a, 'b: 'a> Context<'a, 'b> {
             self.build_requirements(pkg, dep, req, visiting);
         }
 
-        visiting.remove(&pkg.get_package_id());
+        match pkg.get_targets().iter().find(|t| t.get_profile().is_custom_build()) {
+            Some(custom_build) => {
+                self.build_requirements(pkg, custom_build, PlatformPlugin,
+                                        visiting);
+            }
+            None => {}
+        }
+
+        visiting.remove(&key);
     }
 
     pub fn get_requirement(&self, pkg: &'a Package,
index 71aea949b8f6941242093db9736122c3f302c837..c8c79a11284354ceaef14c36ac8d5b55a619fc16 100644 (file)
@@ -598,3 +598,44 @@ test!(build_script_needed_for_host_and_target {
 ", compiling = COMPILING, running = RUNNING, target = target, host = host,
    dir = p.root().display(), sep = path::SEP).as_slice()));
 })
+
+test!(build_deps_for_the_right_arch {
+    if disabled() { return }
+
+    let p = project("foo")
+        .file("Cargo.toml", r#"
+            [package]
+            name = "foo"
+            version = "0.0.0"
+            authors = []
+
+            [dependencies.d2]
+            path = "d2"
+        "#)
+        .file("src/main.rs", "extern crate d2; fn main() {}")
+        .file("d1/Cargo.toml", r#"
+            [package]
+            name = "d1"
+            version = "0.0.0"
+            authors = []
+        "#)
+        .file("d1/src/lib.rs", "
+            pub fn d1() {}
+        ")
+        .file("d2/Cargo.toml", r#"
+            [package]
+            name = "d2"
+            version = "0.0.0"
+            authors = []
+            build = "build.rs"
+
+            [build-dependencies.d1]
+            path = "../d1"
+        "#)
+        .file("d2/build.rs", "extern crate d1; fn main() {}")
+        .file("d2/src/lib.rs", "");
+
+    let target = alternate();
+    assert_that(p.cargo_process("build").arg("--target").arg(&target).arg("-v"),
+                execs().with_status(0));
+})